package com.chapter20.demo1;


import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * Callable和Future接口:
 *
 * Runnable接口的run方法是没有返回值的，但有时候我们希望某个任务在执行完毕后返回一个结果，
 * 那么可以实现Callable<V>接口，该接口也是函数式接口
 *
 * Thread类并不接受Callable对象，如果要使用Thread对象来执行Callable任务，
 * 则可以使用FutureTask类，这个类实现了Runnable接口和Future<V>接口。
 * Future表示异步计算的结果，该接口定义了检查计算是否完成、等待计算完成，以及获取计算结果的方法。
 */
public class CallableSumTask {
    public static void main(String[] args) {
        //Lambda表达式来实现Callable接口的call方法。
        FutureTask<Integer> task = new FutureTask<>(() -> {
            //计算1加到100并返回
            int sum = 0;
            for (int i = 0; i <= 100; i++) {
                sum = sum + i;
            }
            return sum;
        });

        new Thread(task).start();

        try {
            //获取结果。该方法会阻塞，直到计算完成。
            Integer result = task.get();
            System.out.println("1加到100的结果为：" + result);

        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }


    }
}
